package com.scheduledtasklearn;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;

public class TimerLearn {
    public static void main(String[] args) {
        Timer timer = new Timer();
        long period = 1000; // 1秒周期
        long delay = 2000;  // 2秒延迟

        // 1. 单次任务（指定时间执行）
        System.out.println("安排单次任务在2秒后执行...");
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("单次任务执行（指定时间）: " + new Date());
            }
        }, new Date(System.currentTimeMillis() + 2000));

        // 2. 单次任务（延迟指定毫秒后执行）
        System.out.println("安排单次任务延迟2秒后执行...");
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("单次任务执行（延迟毫秒）: " + new Date());
            }
        }, 2000);

        // 3. 固定延迟周期任务（模拟任务执行时间超过周期）
        System.out.println("安排固定延迟周期任务（周期1秒，但任务执行2秒）...");
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("固定延迟任务开始: " + new Date());
                try {
                    TimeUnit.MILLISECONDS.sleep(2000); // 模拟任务执行2秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("固定延迟任务结束: " + new Date());
            }
        }, delay, period);

        // 4. 固定速率周期任务（模拟任务执行时间超过周期）
        System.out.println("安排固定速率周期任务（周期1秒，但任务执行2秒）...");
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println("固定速率任务开始: " + new Date());
                try {
                    TimeUnit.MILLISECONDS.sleep(2000); // 模拟任务执行2秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("固定速率任务结束: " + new Date());
            }
        }, delay, period);

        // 主线程延迟5秒后终止Timer（否则程序会一直运行）
        try {
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        timer.cancel();
    }
}
